﻿Public Class Route
    ' La liste des index de stations composant le parcours
    Private _Stations As New List(Of Integer)
    ' Propriété afin de permettre le chargement et l'enregistrement dans un fichier
    Public Property Stations As List(Of Integer)
        Get
            Return _Stations
        End Get
        Set(ByVal Value As List(Of Integer))
            _Stations = Value
        End Set
    End Property

    ' La liste des index de stations effectuant un arrêt sur ce parcours
    Private _Stops As New List(Of Integer)
    Public Property Stops As List(Of Integer)
        Get
            Return _Stops
        End Get
        Set(ByVal Value As List(Of Integer))
            _Stops = Value
        End Set
    End Property

    ' Détermine si le parcours est actif
    Public Function IsActive() As Boolean
        Return (_Stations.Count > 0)
    End Function

    ' Ajoute une station au parcours
    Public Sub AddStation(Station As Integer)
        _Stations.Add(Station)
    End Sub

    ' Définit que la station donnée est un arrêt
    Public Sub SetStop(Station As Integer)
        _Stops.Add(Station)
    End Sub

    ' Supprime l'arrêt sur la station donnée (mais ne la supprime pas du parcours)
    Public Sub UnsetStop(Station As Integer)
        _Stops.Remove(Station)
    End Sub

    ' Détermine si la station donnée est un arrêt
    Public Function IsStop(Station As Integer) As Boolean
        Return (_Stops.IndexOf(Station) > -1)
    End Function

    ' Remet à zéro le parcours
    Public Sub Clear()
        _Stations.Clear()
        _Stops.Clear()
    End Sub

    ' Renvoie la prochaine station du parcours à partir de la station de départ et d'arrivée du rail
    Public Function GetNextStation(FromStation As Integer, ToStation As Integer) As Integer
        ' Récupère les index des stations dans la liste des stations du parcours
        Dim FromIDX As Integer = _Stations.IndexOf(FromStation)
        Dim ToIDX As Integer = _Stations.IndexOf(ToStation)

        '  Si on se trouve à un des terminus du parcours, on repart d'où on vient
        If (ToIDX = _Stations.Count - 1) Or (ToIDX = 0) Then
            Return FromStation
        End If

        ' Si on se trouve au début du parcours, on va dans un sens défini
        If FromIDX = 0 Then Return _Stations.Item(2)

        ' Renvoie l'index de la future station en prenant en compte le sens du train dans le parcours
        If ToStation = _Stations.Item(FromIDX - 1) Then
            If FromIDX > 1 Then
                Return _Stations.Item(FromIDX - 2)
            End If
        ElseIf ToStation = _Stations.Item(FromIDX + 1) Then
            If FromIDX < _Stations.Count - 2 Then
                Return _Stations.Item(FromIDX + 2)
            End If
        End If

        ' Si on a toujours pas trouvé la station suivante, c'est que le parcours est trop petit donc on repart
        Return FromStation
    End Function
End Class
